#include<bits/stdc++.h>
using namespace std;
const int maxn=1001000+5;
int In[maxn],Out[maxn];
struct Edge{
	int u,v,w,nXt;
}e[maxn];
vector<int> Dep_Cnt[maxn];
int E,elast[maxn],Dep[maxn];
void get_add(int u,int v/*,int w*/){
	e[++E].u=u;
	e[E].v=v;
	// e[E].w=w;
	e[E].w=1;
	e[E].nXt=elast[u];
	elast[u]=E;
}
int cnt=0;
void dfs(int x,int fa){
	In[x]=++cnt,Out[x]=cnt;
	Dep[x]=Dep[fa]+1;
	Dep_Cnt[Dep[x]].push_back(In[x]);
	int y=0;
	for(int i=elast[x];i;i=e[i].nXt){
		y=e[i].v;
		if(y==fa) continue;
		dfs(y,x);
	}
	Out[x]=cnt;
}
vector<int>::iterator/* Die(P) Die(E)?*/ First,End; 
int read(){
	int x;
	scanf("%d",&x);
	return x;
} 
bool check[maxn];
int main(){
	int n=read(),m=read();
	for(int i=1,u=0,v=0;i<n;i++){
		u=read(),v=read();
		get_add(u,v);
		get_add(v,u); 
		check[v]=true;	
	}
	int i;
	for(i=1;i<=n;i++) if(!check[i])break;
	dfs(i,0);
	for(int i=1;i<=m;i++){
		int x=read(),y=read();
		First=lower_bound(Dep_Cnt[y].begin(),Dep_Cnt[y].end(),In[x]);
		End=upper_bound(Dep_Cnt[y].begin(),Dep_Cnt[y].end(),Out[x]);
		int ans=First-End;
		printf(/*"First=%d End=%d*/"%d\n",/*First,End,*/abs(ans));
	}
}